; (function ($) {
    // 添加原型方法   $('xxx').pagenation({ nowPage:1,pageNum:xx, callback:fn})
    $.fn.pagenation = function (options) {
        'use strict'; // 启动严格模式
        var arr = []  // 定义一个数组

        // 构造函数
        function Paging(element, options) { // dom元素  配置
            this.element = element; // 挂载dom元素
            this.options = { // 挂载opitons
                nowPage: options.nowPage || 1, // 当前页码
                pageNum: options.pageNum, // 总页码
                canJump: options.canJump || 0, // 是否能跳转。0=不显示（默认），1=显示
                showOne: options.showOne || 1, //只有一页时，是否显示。0=不显示,1=显示（默认）
                buttonNum: (options.buttonNum >= 5 ? options.buttonNum : 5) || 7, // 页面显示页码数量
                callback: options.callback // 回调函数
            };
            this.init(); // 初始化
        }
        // 构造函数的原型
        Paging.prototype = {
            constructor: Paging, // 还原构造器
            init: function () {
                this.createHtml(); // 创建html节点
                this.bindClickEvent(); // 绑定事件
                this.disabled(); // 是否禁用
            },
            // 创建html
            createHtml: function () {
                var me = this;
                var nowPage = this.options.nowPage;
                var pageNum = this.options.pageNum;
                var buttonNum = this.options.buttonNum;
                var canJump = this.options.canJump;
                var showOne = this.options.showOne;
                var content = [];
                //对nowPage进行判断
                nowPage = nowPage > pageNum ? pageNum : nowPage;
                nowPage = nowPage < 1 ? 1 : nowPage;

                //如果只有一页并且设置为不显示，则不进行渲染
                if (showOne && pageNum === 1) {
                    return '';
                }
                content.push("<ul>");
                content.push("<li class='xl-prevPage'>上一页</li>");
                //页面总数小于等于当前要展示页数总数，展示所有页面
                if (pageNum <= buttonNum) {
                    for (var i = 1; i <= pageNum; i++) {
                        if (nowPage !== i) {
                            content.push("<li>" + i + "</li>");
                        } else {
                            content.push("<li class='xl-active'>" + i + "</li>");
                        }
                    }
                } else if (nowPage <= Math.floor(buttonNum / 2)) {
                    //当前页面小于等于展示页数总数的一半（向下取整），从1开始
                    for (var i = 1; i <= buttonNum - 2; i++) {
                        if (nowPage !== i) {
                            content.push("<li>" + i + "</li>");
                        } else {
                            content.push("<li class='xl-active'>" + i + "</li>");
                        }
                    }
                    content.push("<li class='xl-disabled'>...</li>");
                    content.push("<li>" + pageNum + "</li>");
                } else if (pageNum - nowPage <= Math.floor(buttonNum / 2)) {
                    //当前页面大于展示页数总数的一半（向下取整）
                    content.push("<li>" + 1 + "</li>");
                    content.push("<li class='xl-disabled'>...</li>");
                    for (var i = pageNum - buttonNum + 3; i <= pageNum; i++) {
                        if (nowPage !== i) {
                            content.push("<li>" + i + "</li>");
                        } else {
                            content.push("<li class='xl-active'>" + i + "</li>");
                        }
                    }
                } else {
                    //前半部分页码
                    if (nowPage - Math.floor(buttonNum / 2) <= 0) {
                        for (var i = 1; i <= Math.floor(buttonNum / 2); i++) {
                            if (nowPage !== i) {
                                content.push("<li>" + i + "</li>");
                            } else {
                                content.push("<li class='xl-active'>" + i + "</li>");
                            }
                        }
                    } else {
                        content.push("<li>" + 1 + "</li>");
                        content.push("<li class='xl-disabled'>...</li>");
                        for (var i = nowPage - Math.floor(buttonNum / 2) + (buttonNum % 2 == 0 ? 3 : 2); i <= nowPage; i++) {
                            if (nowPage !== i) {
                                content.push("<li>" + i + "</li>");
                            } else {
                                content.push("<li class='xl-active'>" + i + "</li>");
                            }
                        }

                    }
                    //后半部分页码
                    if (pageNum - nowPage <= 0) {
                        for (var i = nowPage + 1; i <= pageNum; i++) {
                            content.push("<li>" + i + "</li>");
                        }
                    } else {
                        for (var i = nowPage + 1; i <= nowPage + Math.floor(buttonNum / 2) - 2; i++) {
                            content.push("<li>" + i + "</li>");
                        }
                        content.push("<li class='xl-disabled'>...</li>");
                        content.push("<li>" + pageNum + "</li>");
                    }
                }
                content.push("<li class='xl-nextPage'>下一页</li>");
                if (canJump) {
                    content.push("<li class='xl-jumpText xl-disabled'>跳转到<input type='number' id='xlJumpNum'>页</li>");
                    content.push("<li class='xl-jumpButton'>确定</li>");
                }
                content.push("</ul>");
                me.element.html(content.join(''));
                // DOM重新生成后每次调用是否禁用button
                setTimeout(function () {
                    me.disabled();
                }, 20);

            },
            bindClickEvent: function () {
                var me = this;
                me.element.off('click', 'li');
                me.element.on('click', 'li', function () {
                    var cla = $(this).attr('class');
                    var num = parseInt($(this).html());
                    var nowPage = me.options.nowPage;
                    if ($(this).hasClass('xl-disabled') || cla === 'xl-jumpText') {
                        return '';
                    }
                    if (cla === 'xl-prevPage') {
                        if (nowPage !== 1) {
                            me.options.nowPage -= 1;
                        }
                    } else if (cla === 'xl-nextPage') {
                        if (nowPage !== me.options.pageNum) {
                            me.options.nowPage += 1;
                        }
                    } else if (cla === 'xl-jumpButton') {
                        me.options.nowPage = Number($('#xlJumpNum').val());
                    } else {
                        me.options.nowPage = num;
                    }
                    me.createHtml();
                    if (me.options.callback) {
                        me.options.callback(me.options.nowPage);
                    }
                });

            },
            disabled: function () {
                var me = this;
                var nowPage = me.options.nowPage;
                var pageNum = me.options.pageNum;
                if (nowPage === 1) {
                    me.element.children().children('.xl-prevPage').addClass('xl-disabled');
                } else if (nowPage === pageNum) {
                    me.element.children().children('.xl-nextPage').addClass('xl-disabled');
                }
            }
        }
        return new Paging($(this), options);
    }
})(jQuery);